package com.apache.netty.groupchat;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

import java.util.Scanner;

public class GroupChatClient {

  // 属性
  private final String host;
  private final int port;

  public GroupChatClient(String host, int port) {
    this.host = host;
    this.port = port;
  }

  public void run() throws Exception {
    EventLoopGroup group = new NioEventLoopGroup();
    try {
      Bootstrap bootstrap =
          new Bootstrap()
              .group(group)
              .channel(NioSocketChannel.class)
              .handler(
                  new ChannelInitializer<SocketChannel>() {

                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                      // 得到pipeline
                      ChannelPipeline pipeline = ch.pipeline();
                      // 加入相关handler:自定义编码器和解码器
                      pipeline.addLast("decoder", new StringDecoder());
                      pipeline.addLast("encoder", new StringEncoder());
                      // 加入自定义的handler
                      pipeline.addLast(new GroupChatClientHandler());
                    }
                  });

      ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
      // 得到channel
      Channel channel = channelFuture.channel();
      System.out.println("-------" + channel.localAddress() + "--------");
      // 客户端需要输入信息，创建一个扫描器
      Scanner scanner = new Scanner(System.in);
      while (scanner.hasNextLine()) {
        String msg = scanner.nextLine();
        // 通过channel 发送到服务器端
        channel.writeAndFlush(msg + "\r\n");
      }
    } finally {
      group.shutdownGracefully();
    }
  }

  public static void main(String[] args) throws Exception {
    new GroupChatClient("127.0.0.1", 7000).run();
  }
}
